Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

230
Visualizações
Este código se ejecuta para grid<=11 pero se atasca para siempre para grid>=12. ¿Alguien puede explicar por qué sucede esto? (Usando la biblioteca p5.js de JavaScript)

Básicamente el título. He leído cada línea muchas veces y todavía no puedo encontrar mi error. Solo estoy tratando de poner cuadrados en una cuadrícula llamando a una función recursiva que crea el objeto y luego se vuelve a llamar a sí misma. He comprobado que la recursión no es infinita y hay una condición de salida simple. Por favor ayuda.

 let grid = 11; let sqr = []; function setup() { createCanvas(grid * grid, grid * grid); noFill(); colorMode(HSB); noLoop(); let maxs = floor(grid / 3); let ratio = 2 * maxs * maxs; makegrid(maxs, ratio); } function draw() { background(0); for (let sq of sqr) sq.show(); } function makegrid(m, r) { if (!m) return; if (m == floor(grid / 3)) { for (let i = 0; i < 2; i++) sqr.push(new sqrs(m, r)); m--; makegrid(m, r); } else { let j = r / (m * m); for (let k = 0; k < j; k++) sqr.push(new sqrs(m, r)); m--; makegrid(m, r); } } class sqrs { constructor(m, r) { let flag = true; this.s = (m * width) / grid; while (flag) { flag = false; this.x = (width / grid) * floor((grid + 1 - m) * random()); this.y = (height / grid) * floor((grid + 1 - m) * random()); if (!sqr.length) flag = false; else { for (let sq of sqr) { let d = (this.x - sq.x) ** 2 + (this.y - sq.y) ** 2; if (d < this.s ** 2 || d < sq.s ** 2) { flag = true; break; } } } } } show() { stroke(random(340), 80, 80); square(this.x, this.y, this.s); } }
about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Como Jay señaló en los comentarios, no es la recursión el problema, sino el ciclo while (flag) en su constructor sqrs que es el problema:

 let grid = 12; let sqr = []; function setup() { createCanvas(grid * grid, grid * grid); noFill(); colorMode(HSB); noLoop(); // maxs will be 4 if grid is 12 let maxs = floor(grid / 3); // ratio will be 32 let ratio = 2 * maxs * maxs; makegrid(maxs, ratio); } function draw() { background(0); for (let sq of sqr) sq.show(); } function makegrid(m, r) { if (m <= 0) return; if (m == floor(grid / 3)) { // Call 0: m == floor(grid / 3) == 4 for (let i = 0; i < 2; i++) sqr.push(new sqrs(m, r)); m--; // Call 0: makegrid(3, 32); makegrid(m, r); } else { // Call 1: j = 32 / (3 * 3) = 3.55555 // Call 2: j = 32 / (2 * 2) = 8 // Call 3: j = 32 / (1 * 1) = 32 let j = r / (m * m); for (let k = 0; k < j; k++) sqr.push(new sqrs(m, r)); m--; // Call 1: makegrid(2, 32) // Call 2: makegrid(1, 32) // Call 3: makegrid(0, 32) makegrid(m, r); } } class sqrs { constructor(m, r) { let flag = true; this.s = (m * width) / grid; // This code might end up repeating forever because every randomly generated // position is too close to some existing square let count = 0; while (flag && ++count < 1000) { flag = false; this.x = (width / grid) * floor((grid + 1 - m) * random()); this.y = (height / grid) * floor((grid + 1 - m) * random()); if (sqr.length) { // Check if the new square is too close to any existing squares for (let sq of sqr) { let d = (this.x - sq.x) ** 2 + (this.y - sq.y) ** 2; if (d < this.s ** 2 || d < sq.s ** 2) { flag = true; break; } } } } if (flag) { this.s = 0; print(`gave up after ${count} attempts to find a position for this square.`); } } show() { stroke(random(340), 80, 80); square(this.x, this.y, this.s); } }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"></script>

La lógica en ese bucle while no tiene mucho sentido para mí, así que tendrás que describir lo que realmente estás tratando de hacer si quieres más consejos.

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda